package itheima03;

import domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
    反射带参构造方法并运行
    步骤:
        1.获取Class类型的对象(三种方式,建议使用第三种forName)
        2.通过Class类型的对象获取带参构造方法对象
        3.执行构造方法对象,创建一个具体的对象
            java.lang.reflect.Constructor类  成员方法
            public Object newInstance(Object... params): 执行构造方法对象,创建一个具体的对象
                参数:
                    Object... params: 可变参数,可以传递数组,参数列表,不传递(执行的就是空参构造)
                参数作用:对象中的成员变量,所需要的具体的数据,不传使用默认值

                返回值:
                    Object类型: 被创建出来的对象,提升为Object类型

            对比:假设已经获取了满参构造方法对象con
                使用反射之前: Person p = new Person("张三",20);
                使用反射之后: Object obj = con.newInstance("张三",20);



 */
/*public class Demo06NewInstance {
    public static void main(String[] args) throws Exception {
        //1.获取Class类型的对象(三种方式,建议使用第三种forName)
        Class<?> c = Class.forName("domain.Person");
        //2.通过Class类型的对象获取带参构造方法对象
        //获取满参构造方法对象
        Constructor<?> con = c.getConstructor(String.class, int.class);
        //3.执行带参构造方法对象,创建一个具体的对象
        Person p = (Person)con.newInstance("张三",20);

        System.out.println(p);
    }
}*/

public class Demo06NewInstance {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> c=Class.forName("domain.Person");
        Constructor<?>constructor=c.getConstructor(String.class,int.class);
        Person person=(Person)constructor.newInstance("wkr",26);
        System.out.println(person);

    }
}